﻿--============================================================
--Cập nhật các store procedure cho dữ liệu mới
--============================================================
-- Ghi chú khi đi đồng bộ CSDL
/* Do phân lại giá trị các bộ phận khi xác nhận phiếu
-- BCTH = 0 (KH chưa xác nhận) 
-- BCTH = 1 (KH xác nhận)
-- BCTH = 2 (TCT xác nhận)
-- BCTH = 3 (Kho xác nhận)
-- BCTH = 4 (TCSL xác nhận)*/

-- =============================================
-- Author:		HT
-- Update date: 2014-03-01
-- Update date: 2014-04-01
-- Description:	Tài chính tiền xác nhận
-- Tài chính tiền sẽ không còn cập nhật slth và slss vì:
-- + slth do Kho thực hiện
-- + slss do TCSL thực hiện
-- =============================================
create      procedure [dbo].[sp_TCT_XacNhan]
@DPNX_ID as numeric, @kyqt as tinyint
as
begin
	--Khi tai chinh xac nhan thi thuc hien chuyen theo cac buoc sau:
	--B1: Update tblDPNX: set bcth = 2, kyqt = @kyqt
	--B2: Update tblSLNX: set slth = slkh
	--B3: Update cac mat hang cua phieu NX trong tblTON:

	declare @nx as varchar(1), @tcnx_id as varchar(6), @slnx_id as numeric, @mathang_id as numeric
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 2, kyqt = @kyqt
	where dpnx_id = @dpnx_id
end

go
-- ===================================================================
-- =============================================
-- Author:		HT
-- Update date: 2014-03-01
-- Update date: 2014-04-01
-- Description:	Tài chính tiền hủy xác nhận
-- =============================================
create     procedure [dbo].[sp_TCT_HuyXacNhan]
@DPNX_ID as numeric
as
begin
--Khi tai chinh huy xac nhan thi thuc hien chuyen theo cac buoc sau:
--B1: Update tblDPNX: set bcth = 4, kyqt = 1
--B3: Update cac mat hang cua phieu NX trong tblTON:
	declare @nx as varchar(1), @tcnx_id as varchar(6), @slnx_id as numeric, @mathang_id as numeric
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 4, kyqt = 1
	where dpnx_id = @dpnx_id
end

go
-- ============================================================
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Description:	Kế hoạch xác nhận
-- Sau khi KH nhập thông tin phiếu xong thì sẽ xác nhận là phiếu đã được KH xác nhận
-- Khi đó, Kho mới có quyền xác nhận slth
-- =============================================
create      procedure [dbo].[sp_KeHoach_XacNhan]
@DPNX_ID as numeric
as
begin
	--Khi kế hoạch xác nhận thì:
	--B1: Update tblDPNX: set bcth = 1
	--B3: Update slkh của các mặt hàng của phiếu NX trong tblTON:
	declare @nx as varchar(1), @tcnx_id as varchar(6) 
	declare @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 1
	where dpnx_id = @dpnx_id
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B3: Update cac mat hang cua phieu NX trong tblTON
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLKH
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slkh
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin	
				update tblTON
				set slndkkh = slndkkh + @slkh,
				sltonkh = sltonth + @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				update tblTON
				set slxdkkh = slxdkkh + @slkh,
				sltonkh = sltonkh - @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		close cur
		deallocate cur
	end
end

go
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Description:	Kế hoạch hủy xác nhận
-- Kế hoạch hủy xác nhận phiếu sẽ quay về trạng thái chưa có xác nhận
-- Các số lượng KH trong bảng tblTON sẽ reset lại
-- =============================================
create      procedure [dbo].[sp_KeHoach_HuyXacNhan]
@DPNX_ID as numeric
as
begin
	--Khi kế hoạch xác nhận thì:
	--B1: Update tblDPNX: set bcth = 0
	--B3: Update slkh của các mặt hàng của phiếu NX trong tblTON:
	declare @nx as varchar(1), @tcnx_id as varchar(6) 
	declare @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 0
	where dpnx_id = @dpnx_id
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B3: Update cac mat hang cua phieu NX trong tblTON
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLKH
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slkh
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				update tblTON
				set slndkkh = slndkkh - @slkh,
				sltonkh = sltonkh - @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				update tblTON
				set slxdkkh = slxdkkh - @slkh,
				sltonkh = sltonkh + @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		close cur
		deallocate cur
	end
end

go
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Update date: 2014-04-01
-- Description:	Kho xác nhận, cập nhật các số lượng thực hiện
-- ** Ghi chú: khi Kho xác nhận thì sẽ lấy slkh để cập nhật cho slth
-- =============================================
create     procedure [dbo].[sp_Kho_XacNhan]
@DPNX_ID as numeric
as
begin
	--Khi kế hoạch xác nhận thì:
	--B1: Update tblDPNX: set bcth = 3
	--B3: Update slkh của các mặt hàng của phiếu NX trong tblTON:

	declare @nx as varchar(1), @tcnx_id as varchar(6)
	declare @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 3
	where dpnx_id = @dpnx_id
	
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B3: Update cac mat hang cua phieu NX trong tblTON
		--** Chú ý: kho cập nhật thì phải lấy SLKH cập nhật vào SLTH
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLKH
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slkh
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				--B2: Update tblSLNX
				update tblSLNX
				set slth = @slkh
				where dpnx_id = @dpnx_id
				and mathang_id = @mathang_id
				
				update tblTON
				set slndkth = slndkth + @slkh,
				sltonth = sltonth + @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				--B2: Update tblSLNX
				update tblSLNX
				set slth = @slkh
				where dpnx_id = @dpnx_id
				and mathang_id = @mathang_id
				
				update tblTON
				set slxdkth = slxdkth + @slkh,
				sltonth = sltonth - @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		close cur
		deallocate cur
	end
end
	
go
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Update date: 2014-04-01
-- Description:	Kho hủy xác nhận
-- Kho hủy xác nhận thì phiếu sẽ về lại trạng thái KH xác nhận
-- =============================================
create      procedure [dbo].[sp_Kho_HuyXacNhan]
@DPNX_ID as numeric
as
begin
	--Khi kế hoạch xác nhận thì:
	--B1: Update tblDPNX: set bcth = 1
	--B3: Update slkh của các mặt hàng của phiếu NX trong tblTON:

	declare @nx as varchar(1), @tcnx_id as varchar(6), @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2), @slth as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 1 --bcth=1 về trạng thái KH xác nhận
	where dpnx_id = @dpnx_id
	
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B3: Update cac mat hang cua phieu NX trong tblTON
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLTH 
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slth
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				--B2: Update tblSLNX
				update tblSLNX
				set slth = 0
				where dpnx_id = @dpnx_id
				and mathang_id = @mathang_id
				
				update tblTON
				set slndkth = slndkth - @slth,
				sltonth = sltonth - @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				--B2: Update tblSLNX
				update tblSLNX
				set slth = 0
				where dpnx_id = @dpnx_id
				and mathang_id = @mathang_id
				
				update tblTON
				set slxdkth = slxdkth - @slth,
				sltonth = sltonth + @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		close cur
		deallocate cur
	end
end

go
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Description:	Kho xác nhận
-- =============================================
create      procedure [dbo].[sp_TCSL_XacNhan]
@DPNX_ID as numeric
as
begin
	--Khi kế hoạch xác nhận thì:
	--B1: Update tblDPNX: set bcth = 4
	--B3: Update slkh của các mặt hàng của phiếu NX trong tblTON:

	declare @nx as varchar(1), @tcnx_id as varchar(6)
	declare @slnx_id as numeric, @mathang_id as numeric, @slth as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B1: Update tblDPNX
		update tblDPNX
		set bcth = 4 -- TCSL xác nhận
		where dpnx_id = @dpnx_id
		
		--B3: Update cac mat hang cua phieu NX trong tblTON
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLTH 
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slth
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				update tblTON
				set sltonss = sltonss + @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				update tblTON
				set sltonss = sltonss - @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		close cur
		deallocate cur
	end
end
	
go
-- =============================================
-- Author:		HT
-- Create date: 2014-03-01
-- Description:	Kho hủy xác nhận
-- Kho hủy xác nhận thì phiếu sẽ về lại trạng thái KH xác nhận
-- =============================================
create      procedure [dbo].[sp_TCSL_HuyXacNhan]
@DPNX_ID as numeric
as
begin
	--Khi TCSL hủy xác nhận thì:
	--B1: Cập nhật lại tình trạng bcth = 3 (Quay về Kho xác nhận)
	--B3: Cập nhật lại sltss của các mặt hàng của phiếu NX trong tblTON:

	declare @nx as varchar(1), @tcnx_id as varchar(6)
	declare @slnx_id as numeric, @mathang_id as numeric, @slth as numeric(13,2)
	select @NX = NX, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	
	--B1: Update tblDPNX
	update tblDPNX
	set bcth = 3 -- Quay về tình trạng Kho xác nhận
	where dpnx_id = @dpnx_id
	
	--Nếu phiếu không phải là DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		--B3: Update cac mat hang cua phieu NX trong tblTON
		declare cur cursor for
		select SLNX_ID, MATHANG_ID, SLTH 
		from tblSLNX 
		where DPNX_ID = @DPNX_ID
		open cur
		fetch next from cur
		into @slnx_id, @mathang_id, @slth
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				update tblTON
				set sltonss = sltonss - @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				update tblTON
				set sltonss = sltonss + @slth
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLTH
			end
		close cur
		deallocate cur
	end
end


--============================================================
--Ngày 2014-04-19:
-- Tách sp_UpdateSLTONMatHangByDPNX_ID thành 2 function riêng:
-- 1) sp_ResetSLTONByDPNX: dùng cho kế hoạch cập nhật phiếu NX thông thường
-- 2) sp_ResetSLTONByDPNX_DCSS: dùng cho kế hoạch cập nhật phiếu NX DCSS

--Remove store sp_UpdateSLTONMatHangByDPNX_ID
--============================================================

go
-- =============================================
-- Author:		HT
-- Create date: 2014-04-19
-- Update date: 2014-04-19
-- Description:	Reset lại slton của các mặt hàng trong phiếu NX
-- Dùng trường hợp khi Kế hoạch cập nhật phiếu NX thông thường (không phải phiếu NX DCSS)
-- =============================================
create       procedure [dbo].[sp_ResetSLTONByDPNX]
@DPNX_ID as numeric
as
	declare @nx as varchar(1), @bcth as int, @tcnx_id as varchar(6), @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2)
	declare @upd_err as int
	select @NX = NX, @bcth = bcth, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	declare cur cursor for
	select SLNX_ID, MATHANG_ID, SLKH
	from tblSLNX 
	where DPNX_ID = @DPNX_ID
	
	open cur
	fetch next from cur
	into @slnx_id, @mathang_id, @slkh
	-- Nếu phiếu NX không phải là phiếu DCSS
	if not exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		if @NX = 'N' --Neu la phieu nhap
			while @@fetch_status = 0
			begin
				if @bcth = 1 -- Trường hợp Kế hoạch cập nhật phiếu
					update tblTON
					set slndkkh = slndkkh - @slkh, 
					sltonkh = sltonkh - @slkh
					where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		else --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				if @bcth = 1	-- Trường hợp Kế hoạch cập nhật phiếu
					update tblTON
					set slxdkkh = slxdkkh - @slkh, 
					sltonkh = sltonkh + @slkh				
					where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
	end
	close cur
	deallocate cur
	
go
-- =============================================
-- Author:		HT
-- Create date: 2014-04-19
-- Update date: 2014-04-19
-- Description:
-- Dùng trường hợp khi Kế hoạch cập nhật phiếu NX DCSS
-- Reset lại slton của các mặt hàng trong phiếu NX
-- ** Ghi chú: do đây là phiếu DCSS nên kế hoạch lập phiếu này để số lượng slss11 đầu năm
-- Khi đó, toàn bộ sltonkh, sltonth, sltonss sẽ điều chỉnh theo
-- Các quyền khác như Kho, TCSL, TCT chỉ cần xác nhận tình trạng phiếu chứ không cần thay đổi số lượng tồn
-- =============================================
create       procedure [dbo].[sp_ResetSLTONByDPNX_DCSS]
@DPNX_ID as numeric
as
	declare @nx as varchar(1), @bcth as int, @tcnx_id as varchar(6), @slnx_id as numeric, @mathang_id as numeric, @slkh as numeric(13,2)
	declare @upd_err as int
	select @NX = NX, @bcth = bcth, @tcnx_id = tcnx from tblDPNX where DPNX_ID = @DPNX_ID
	declare cur cursor for
	select SLNX_ID, MATHANG_ID, SLKH
	from tblSLNX 
	where DPNX_ID = @DPNX_ID
	
	open cur
	fetch next from cur
	into @slnx_id, @mathang_id, @slkh
	-- Nếu phiếu NX là phiếu DCSS
	if exists(select * from tblTCNX where kh = @tcnx_id and ten = N'DCSS')
	begin
		if @NX = 'N' --Neu la phieu nhap, Ko can xet Ban Tai Chinh hay Ke Hoach
			while @@fetch_status = 0
			begin
				update tblTON
				set slss11 = slss11 - @slkh, -- thay đổi số lượng sổ sách đầu năm các slton khác thay đổi theo
				sltonkh = sltonkh - @slkh,
				sltonth = sltonth - @slkh,
				sltonss = sltonss - @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
		else if @NX = 'X' --Neu la phieu xuat
			while @@fetch_status = 0
			begin
				update tblTON
				set slss11 = slss11 + @slkh, -- thay đổi số lượng sổ sách đầu năm các slton khác thay đổi theo
				sltonkh = sltonkh + @slkh,
				sltonth = sltonth + @slkh,
				sltonss = sltonss + @slkh
				where mathang_id = @mathang_id
				fetch next from cur
				into @SLNX_ID, @MATHANG_ID, @SLKH
			end
	end
	close cur
	deallocate cur
	
